home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 365_03 / vi.h < prev    next >
C/C++ Source or Header  |  1992-04-04  |  21KB  |  597 lines

  1. /* vi.h */
  2.  
  3. /* Author:
  4.  *    Steve Kirkendall
  5.  *    14407 SW Teal Blvd. #C
  6.  *    Beaverton, OR 97005
  7.  *    kirkenda@cs.pdx.edu
  8.  */
  9.  
  10. #define VERSION "ELVIS 1.5, by Steve Kirkendall (23 March 1992)"
  11. #define COPYING    "This version of ELVIS is freely redistributable."
  12.  
  13. #include <errno.h>
  14. extern int errno;
  15. #if TOS && !defined(__GNUC__)
  16. #define ENOENT (-AEFILNF)
  17. #endif
  18.  
  19. #if TOS || VMS
  20. # include <types.h>
  21. # define O_RDONLY    0
  22. # define O_WRONLY    1
  23. # define O_RDWR        2
  24. # ifdef __GNUC__
  25. #  define S_IJDIR    S_IFDIR
  26. # endif
  27. #else
  28. # if OSK
  29. #  include <modes.h>
  30. #  define O_RDONLY    S_IREAD
  31. #  define O_WRONLY    S_IWRITE
  32. #  define O_RDWR    (S_IREAD | S_IWRITE)
  33. #  define ENOENT    E_PNNF
  34. #  define sprintf    Sprintf
  35. # else
  36. #  include <sys/types.h>
  37. #  if COHERENT
  38. #   include <sys/fcntl.h>
  39. #  else
  40. #   include <fcntl.h>
  41. #  endif
  42. # endif
  43. #endif
  44.  
  45. #ifndef O_BINARY
  46. # define O_BINARY    0
  47. #endif
  48.  
  49. #include "curses.h"
  50.  
  51. #include <signal.h>
  52.  
  53. /*------------------------------------------------------------------------*/
  54. /* Miscellaneous constants.                          */
  55.  
  56. #define INFINITY    2000000001L    /* a very large integer */
  57. #define LONGKEY        10        /* longest possible raw :map key */
  58. #ifndef MAXRCLEN
  59. # define MAXRCLEN    1000        /* longest possible :@ command */
  60. #endif
  61.  
  62. /*------------------------------------------------------------------------*/
  63. /* These describe how temporary files are divided into blocks             */
  64.  
  65. #define MAXBLKS    (BLKSIZE / sizeof(unsigned short))
  66. typedef union
  67. {
  68.     char        c[BLKSIZE];    /* for text blocks */
  69.     unsigned short    n[MAXBLKS];    /* for the header block */
  70. }
  71.     BLK;
  72.  
  73. /*------------------------------------------------------------------------*/
  74. /* These are used manipulate BLK buffers.                                 */
  75.  
  76. extern BLK    hdr;        /* buffer for the header block */
  77. extern BLK    *blkget();    /* given index into hdr.c[], reads block */
  78. extern BLK    *blkadd();    /* inserts a new block into hdr.c[] */
  79.  
  80. /*------------------------------------------------------------------------*/
  81. /* These are used to keep track of various flags                          */
  82. extern struct _viflags
  83. {
  84.     short    file;        /* file flags */
  85. }
  86.     viflags;
  87.  
  88. /* file flags */
  89. #define NEWFILE        0x0001    /* the file was just created */
  90. #define READONLY    0x0002    /* the file is read-only */
  91. #define HADNUL        0x0004    /* the file contained NUL characters */
  92. #define MODIFIED    0x0008    /* the file has been modified, but not saved */
  93. #define NOFILE        0x0010    /* no name is known for the current text */
  94. #define ADDEDNL        0x0020    /* newlines were added to the file */
  95. #define HADBS        0x0040    /* backspace chars were lost from the file */
  96. #define UNDOABLE    0x0080    /* file has been modified */
  97. #define NOTEDITED    0x0100    /* the :file command has been used */
  98.  
  99. /* macros used to set/clear/test flags */
  100. #define setflag(x,y)    viflags.x |= y
  101. #define clrflag(x,y)    viflags.x &= ~y
  102. #define tstflag(x,y)    (viflags.x & y)
  103. #define initflags()    viflags.file = 0;
  104.  
  105. /* The options */
  106. extern char    o_autoindent[1];
  107. extern char    o_autoprint[1];
  108. extern char    o_autotab[1];
  109. extern char    o_autowrite[1];
  110. extern char    o_columns[3];
  111. extern char    o_directory[30];
  112. extern char    o_edcompatible[1];
  113. extern char    o_equalprg[80];
  114. extern char    o_errorbells[1];
  115. extern char    o_exrefresh[1];
  116. extern char    o_ignorecase[1];
  117. extern char    o_keytime[3];
  118. extern char    o_keywordprg[80];
  119. extern char    o_lines[3];
  120. extern char    o_list[1];
  121. extern char    o_number[1];
  122. extern char    o_readonly[1];
  123. extern char    o_remap[1];
  124. extern char    o_report[3];
  125. extern char    o_scroll[3];
  126. extern char    o_shell[60];
  127. extern char    o_shiftwidth[3];
  128. extern char    o_sidescroll[3];
  129. extern char    o_sync[1];
  130. extern char    o_tabstop[3];
  131. extern char    o_term[30];
  132. extern char    o_flash[1];
  133. extern char    o_warn[1];
  134. extern char    o_wrapscan[1];
  135.  
  136. #ifndef CRUNCH
  137. extern char    o_beautify[1];
  138. extern char    o_exrc[1];
  139. extern char    o_mesg[1];
  140. extern char    o_more[1];
  141. extern char    o_novice[1];
  142. extern char    o_prompt[1];
  143. extern char    o_taglength[3];
  144. extern char    o_terse[1];
  145. extern char    o_window[3];
  146. extern char    o_wrapmargin[3];
  147. extern char    o_writeany[1];
  148. #endif
  149.  
  150. #ifndef NO_ERRLIST
  151. extern char    o_cc[30];
  152. extern char    o_make[30];
  153. #endif
  154.  
  155. #ifndef NO_CHARATTR
  156. extern char    o_charattr[1];
  157. #endif
  158.  
  159. #ifndef NO_DIGRAPH
  160. extern char    o_digraph[1];
  161. extern char    o_flipcase[80];
  162. #endif
  163.  
  164. #ifndef NO_SENTENCE
  165. extern char    o_hideformat[1];
  166. #endif
  167.  
  168. #ifndef NO_EXTENSIONS
  169. extern char    o_inputmode[1];
  170. extern char    o_ruler[1];
  171. #endif
  172.  
  173. #ifndef NO_MAGIC
  174. extern char    o_magic[1];
  175. #endif
  176.  
  177. #ifndef NO_MODELINES
  178. extern char    o_modelines[1];
  179. #endif
  180.  
  181. #ifndef NO_SENTENCE
  182. extern char    o_paragraphs[30];
  183. extern char    o_sections[30];
  184. #endif
  185.  
  186. #if MSDOS
  187. extern char    o_pcbios[1];
  188. #endif
  189.  
  190. #ifndef NO_SHOWMATCH
  191. extern char    o_showmatch[1];
  192. #endif
  193.  
  194. #ifndef    NO_SHOWMODE
  195. extern char    o_smd[1];
  196. #endif
  197.  
  198. /*------------------------------------------------------------------------*/
  199. /* These help support the single-line multi-change "undo" -- shift-U      */
  200.  
  201. extern char    U_text[BLKSIZE];
  202. extern long    U_line;
  203.  
  204. /*------------------------------------------------------------------------*/
  205. /* These are used to refer to places in the text               */
  206.  
  207. typedef long    MARK;
  208. #define markline(x)    (long)((x) / BLKSIZE)
  209. #define markidx(x)    (int)((x) & (BLKSIZE - 1))
  210. #define MARK_UNSET    ((MARK)0)
  211. #define MARK_FIRST    ((MARK)BLKSIZE)
  212. #define MARK_LAST    ((MARK)(nlines * BLKSIZE))
  213. #define MARK_AT_LINE(x)    ((MARK)(x) * BLKSIZE)
  214.  
  215. #define NMARKS    29
  216. extern MARK    mark[NMARKS];    /* marks a-z, plus mark ' and two temps */
  217. extern MARK    cursor;        /* mark where line is */
  218.  
  219. /*------------------------------------------------------------------------*/
  220. /* These are used to keep track of the current & previous files.      */
  221.  
  222. extern long    origtime;    /* modification date&time of the current file */
  223. extern char    origname[256];    /* name of the current file */
  224. extern char    prevorig[256];    /* name of the preceding file */
  225. extern long    prevline;    /* line number from preceding file */
  226.  
  227. /*------------------------------------------------------------------------*/
  228. /* misc housekeeping variables & functions                  */
  229.  
  230. extern int    tmpfd;        /* fd used to access the tmp file */
  231. extern int    tmpnum;        /* counter used to generate unique filenames */
  232. extern long    lnum[MAXBLKS];    /* last line# of each block */
  233. extern long    nlines;        /* number of lines in the file */
  234. extern char    args[BLKSIZE];    /* file names given on the command line */
  235. extern int    argno;        /* the current element of args[] */
  236. extern int    nargs;        /* number of filenames in args */
  237. extern long    changes;    /* counts changes, to prohibit short-cuts */
  238. extern int    significant;    /* boolean: was a *REAL* change made? */
  239. extern BLK    tmpblk;        /* a block used to accumulate changes */
  240. extern long    topline;    /* file line number of top line */
  241. extern int    leftcol;    /* column number of left col */
  242. #define        botline     (topline + LINES - 2)
  243. #define        rightcol (leftcol + COLS - (*o_number ? 9 : 1))
  244. extern int    physcol;    /* physical column number that cursor is on */
  245. extern int    physrow;    /* physical row number that cursor is on */
  246. extern int    exwrote;    /* used to detect verbose ex commands */
  247. extern int    doingdot;    /* boolean: are we doing the "." command? */
  248. extern int    doingglobal;    /* boolean: are doing a ":g" command? */
  249. extern long    rptlines;    /* number of lines affected by a command */
  250. extern char    *rptlabel;    /* description of how lines were affected */
  251. extern char    *fetchline();    /* read a given line from tmp file */
  252. extern char    *parseptrn();    /* isolate a regexp in a line */
  253. extern MARK    paste();    /* paste from cut buffer to a given point */
  254. extern char    *wildcard();    /* expand wildcards in filenames */
  255. extern MARK    input();    /* inserts characters from keyboard */
  256. extern char    *linespec();    /* finds the end of a /regexp/ string */
  257. #define        ctrl(ch) ((ch)&037)
  258. #ifndef NO_RECYCLE
  259. extern long    allocate();    /* allocate a free block of the tmp file */
  260. #endif
  261. extern int    trapint();    /* trap handler for SIGINT */
  262. extern int    deathtrap();    /* trap handler for deadly signals */
  263. extern void    blkdirty();    /* marks a block as being "dirty" */
  264. extern void    blkflush();    /* writes a single dirty block to the disk */
  265. extern void    blks